package service;


import dao.FileDao;
import dao.FileMeta;
import maneger.FileManager;

import java.io.File;
import java.util.List;

/**
 *  service 一般放的都是 业务逻辑
 *  SearchService 描述的就是整个程序的核心业务逻辑
 *  这个地方代码简单是因为 前面都封装好了要用到的东西
 */
public class SearchService {

    private FileDao fileDao = new FileDao();
    private FileManager fileManager = new FileManager();

    // 使用这个线程来周期性的扫描文件
    private Thread t = null;

    // 1.提供一个初始化操作,参数表示的是一个路径
    public void init(String basePath) {
        // 初始情况下,就把数据库初始化好,并进行一个初始化的扫描操作, 在这里我们进行多线程的操作

        fileDao.initDB();

        /**
         *  首次扫描不放在主线程了，会把主线程给卡住，那么页面就会卡住，不能进行其他操作，这显然是不科学的
         *  所以把扫描放到其他线程中去就好了
         */

        // fileManager.scanAll(new File(basePath));

        // 使用匿名内部类的方式
        t = new Thread(() -> {
            // while(true) {
            // 没有被打断，不应该中指，那就执行
            while(!t.isInterrupted()) {

                /**
                 *  扫描是很耗时间的，就把主线程给堵塞了，界面主线程，作用是响应用户的各种界面操作
                 *  主线程堵塞，用户的响应就无法进行了
                 *  扫描不放在主线程了，会把主线程给卡住，那么页面就会卡住，不能进行其他操作，这显然是不科学的
                 *  所以把扫描放到其他线程中去就好了
                 */
                fileManager.scanAll(new File(basePath));

                try {
                    // 休眠 60s,这个就是进行周期性的扫描，为了更正修改文件名称 大小 修改时间等，此处为了不占用资源，设置为 1 个小时
                    Thread.sleep(3600000);
                } catch (InterruptedException e) {
                    e.printStackTrace();

                    /**
                     *  注意 break 很有必要，手动唤醒 sleep 之后，会把标志位清空，那么循环还会继续停不下来
                     */
                    break;
                }
                // fileManager.scanAll(new File(basePath));
            }
        });

        // 实例化 File 对象时,可以传递一个 String 类型的表示路径
        // new File() 包装一下
        // DEBUG
        // fileManager.scanAll(new File(basePath));

        // 启动线程
        t.start();
        System.out.println("[SearchService] 初始化完成!");

    }

    // 使用这个方法，让扫描线程停止下来
    public void shutdown() {
        // 清空标志位，唤醒 sleep，循环结束，也就不再扫描了
        // 防止线程 t 还没创建，就调用空指针异常了
        if (t != null) {
            t.interrupt();
        }
    }

    // 2.提供一个查找方法(查找肯定是和数据库有关的)
    public List<FileMeta> search(String pattern) {
        return fileDao.searchByPattern(pattern);
    }
}
